{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "initial_id",
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 1、LLMChain的使用\n",
    "\n",
    "举例1："
   ],
   "id": "60eedc4743697c97"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-31T06:12:00.517168Z",
     "start_time": "2025-08-31T06:11:58.901208Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from modulefinder import replacePackageMap\n",
    "\n",
    "from langchain.chains.llm import LLMChain\n",
    "from langchain.chains.sequential import SimpleSequentialChain\n",
    "from langchain_core.prompts import PromptTemplate\n",
    "\n",
    "import os\n",
    "import dotenv\n",
    "from langchain_openai import ChatOpenAI\n",
    "\n",
    "dotenv.load_dotenv()\n",
    "\n",
    "os.environ['OPENAI_API_KEY'] = os.getenv(\"OPENAI_API_KEY1\")\n",
    "os.environ['OPENAI_BASE_URL'] = os.getenv(\"OPENAI_BASE_URL\")\n",
    "\n",
    "# 1、创建大模型实例\n",
    "chat_model = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "# 2、提供提示词模板\n",
    "# BasePromptTemplate的典型子类有：PrompTemplate、ChatPromptTemplate\n",
    "prompt_template = PromptTemplate.from_template(\n",
    "    template=\"你是一个数学高手，帮我解决如下的数学问题：{question}\"\n",
    ")\n",
    "\n",
    "chain = LLMChain(llm=chat_model, prompt=prompt_template, )\n",
    "response = chain.invoke(input={\"question\": \"1 + 2 * 3 = ?\"})\n",
    "print(response)"
   ],
   "id": "3f96c64d0d9f141c",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'question': '1 + 2 * 3 = ?', 'text': '根据数学运算的优先级，我们首先要进行乘法运算，然后再进行加法运算。\\n\\n所以，计算过程如下：\\n\\n1 + 2 * 3 = 1 + 6 = 7\\n\\n因此，1 + 2 * 3 = 7。'}\n"
     ]
    }
   ],
   "execution_count": 2
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "举例2：使用ChatPromptTemplate及参数verbose的演示"
   ],
   "id": "213e43b527c64b4d"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-31T06:14:40.176809Z",
     "start_time": "2025-08-31T06:14:38.387375Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain.chains.llm import LLMChain\n",
    "from langchain_core.prompts import PromptTemplate, ChatPromptTemplate\n",
    "\n",
    "import os\n",
    "import dotenv\n",
    "from langchain_openai import ChatOpenAI\n",
    "\n",
    "dotenv.load_dotenv()\n",
    "\n",
    "os.environ['OPENAI_API_KEY'] = os.getenv(\"OPENAI_API_KEY1\")\n",
    "os.environ['OPENAI_BASE_URL'] = os.getenv(\"OPENAI_BASE_URL\")\n",
    "\n",
    "# 1、创建大模型实例\n",
    "chat_model = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "# 2、提供提示词模板\n",
    "# BasePromptTemplate的典型子类有：PrompTemplate、ChatPromptTemplate\n",
    "prompt_template = ChatPromptTemplate.from_messages([\n",
    "    (\"system\", \"你是一个数学高手\"),\n",
    "    (\"human\", \"帮我解决如下的数学问题：{question}\")\n",
    "\n",
    "])\n",
    "\n",
    "chain = LLMChain(\n",
    "    llm=chat_model,\n",
    "    prompt=prompt_template,\n",
    "    verbose=True,  #显式执行过程中的详细日志情况\n",
    ")\n",
    "response = chain.invoke(input={\"question\": \"1 + 2 * 3 = ?\"})\n",
    "print(response)"
   ],
   "id": "76fa106d31322db7",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 你是一个数学高手\n",
      "Human: 帮我解决如下的数学问题：1 + 2 * 3 = ?\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'question': '1 + 2 * 3 = ?', 'text': '根据数学运算的优先级，先进行乘法再进行加法。因此我们先计算 \\\\( 2 * 3 \\\\)，得到 \\\\( 6 \\\\)。然后再进行加法：\\n\\n\\\\[ \\n1 + 6 = 7 \\n\\\\]\\n\\n所以 \\\\( 1 + 2 * 3 = 7 \\\\)。'}\n"
     ]
    }
   ],
   "execution_count": 3
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 2、顺序链之SimpleSequentialChain的使用\n",
    "\n",
    "举例1：\n"
   ],
   "id": "9713d5334dbe20da"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-31T07:49:45.373099Z",
     "start_time": "2025-08-31T07:49:45.303679Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "from langchain.chains import LLMChain\n",
    "\n",
    "chainA_template = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\"system\", \"你是一位精通各领域知识的知名教授\"),\n",
    "        (\"human\", \"请你尽可能详细的解释一下：{knowledge}\"),\n",
    "    ]\n",
    ")\n",
    "\n",
    "chat_model = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "chainA_chains = LLMChain(llm=chat_model,\n",
    "                         prompt=chainA_template,\n",
    "                         verbose=True\n",
    "                         )\n",
    "\n",
    "\n",
    "\n",
    "# chainA_chains.invoke({\"knowledge\":\"什么是LangChain？\"})"
   ],
   "id": "9d3d922af8a50205",
   "outputs": [],
   "execution_count": 5
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-31T07:50:52.129480Z",
     "start_time": "2025-08-31T07:50:52.113359Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "\n",
    "chainB_template = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\"system\", \"你非常善于提取文本中的重要信息，并做出简短的总结\"),\n",
    "        (\"human\", \"这是针对一个提问的完整的解释说明内容：{description}\"),\n",
    "        (\"human\", \"请你根据上述说明，尽可能简短的输出重要的结论，请控制在20个字以内\"),\n",
    "    ]\n",
    ")\n",
    "\n",
    "chainB_chains = LLMChain(llm=chat_model,\n",
    "                         prompt=chainB_template,\n",
    "                         verbose=True\n",
    "                         )"
   ],
   "id": "42907686476fbde4",
   "outputs": [],
   "execution_count": 6
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-31T07:56:06.610177Z",
     "start_time": "2025-08-31T07:56:00.486309Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain.chains.sequential import SimpleSequentialChain\n",
    "\n",
    "full_chain = SimpleSequentialChain(\n",
    "    chains=[chainA_chains, chainB_chains],\n",
    "    verbose=True\n",
    ")\n",
    "\n",
    "#说明：针对于SimpleSequentialChain而言，唯一的输入的变量名是：input\n",
    "response = full_chain.invoke(input={\"input\": \"什么是LangChain?\"})\n",
    "print(response)"
   ],
   "id": "18bed004f47f5d41",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SimpleSequentialChain chain...\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 你是一位精通各领域知识的知名教授\n",
      "Human: 请你尽可能详细的解释一下：什么是LangChain?\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\u001B[36;1m\u001B[1;3mLangChain 是一个开源的框架，旨在帮助开发者构建基于大语言模型（LLM, Large Language Models）和其他 AI 组件的应用程序。LangChain 的设计初衷是通过提供丰富的工具和结构，简化与语言模型的整合和应用开发过程，让开发者能够更高效地构建复杂的 NLP（自然语言处理）应用。\n",
      "\n",
      "### LangChain 的核心概念\n",
      "\n",
      "1. **链（Chains）**：\n",
      "   LangChain 的核心概念是“链”，即将一个或多个操作或组件组合在一起，按顺序执行。每个链可以是简单的，也可以是复杂的，允许开发者定义输入和输出的关系。链可以包括查询、转换、验证等多个步骤。\n",
      "\n",
      "2. **代理（Agents）**：\n",
      "   代理是一种可动态决定其行为和路径的结构，它使用一个语言模型来理解用户输入，并选择最合适的行动。代理通常在需要实时决策的场景下使用，比如与用户的对话。\n",
      "\n",
      "3. **内存（Memory）**：\n",
      "   LangChain 提供了内存管理功能，允许应用在不同的会话中保留用户的上下文和历史信息。这样可以使得对话系统能够更好地理解用户的需求和偏好。\n",
      "\n",
      "4. **工具（Tools）**：\n",
      "   LangChain 支持将外部工具和 API 集成到链或代理中，使得语言模型能够进行逻辑推理、查询数据库、调用 web 服务等、并处理更复杂的任务。\n",
      "\n",
      "5. **文档（Documents）**：\n",
      "   文档处理是 LangChain 另一个重要功能。在需要处理大量文本信息的场景下，LangChain 提供了文档检索和分析的能力，以支持信息提取、总结等任务。\n",
      "\n",
      "### LangChain 的使用场景\n",
      "\n",
      "LangChain 可以用于多种应用场景，包括但不限于：\n",
      "\n",
      "- **聊天机器人**：通过构建链和代理，开发者可以创建能够与用户进行自然交互的对话系统。\n",
      "- **内容生成**：LangChain 可以帮助自动生成文章、报告、诗歌等，特别是在需要多步生成的复杂内容时。\n",
      "- **数据分析**：结合 LLM 的推理能力，LangChain 能够支持复杂的数据查询和分析任务。\n",
      "- **教育工具**：通过智能助手，LangChain 可以支持个性化的学习和辅导体验。\n",
      "\n",
      "### LangChain 的优势\n",
      "\n",
      "- **模块化**：LangChain 的模块化设计使得开发者可以根据需要选择和组合不同的组件，灵活性高。\n",
      "- **开源**：作为一个开源项目，LangChain 有强大的社区支持，开发者可以自由地使用和改进代码。\n",
      "- **集成能力**：能方便地与其他各种工具和平台集成，扩展了应用的功能和适用范围。\n",
      "\n",
      "### 结论\n",
      "\n",
      "LangChain 是一个强大的工具，能够帮助开发者充分利用大语言模型的能力，构建复杂且智能的应用程序。通过灵活的链、代理、内存和工具设计，LangChain 使得自然语言处理应用的开发更加高效和便捷。无论是用于商业应用、教育工具，还是个人项目，LangChain 都为开发者提供了丰富的可能性。\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 你非常善于提取文本中的重要信息，并做出简短的总结\n",
      "Human: 这是针对一个提问的完整的解释说明内容：LangChain 是一个开源的框架，旨在帮助开发者构建基于大语言模型（LLM, Large Language Models）和其他 AI 组件的应用程序。LangChain 的设计初衷是通过提供丰富的工具和结构，简化与语言模型的整合和应用开发过程，让开发者能够更高效地构建复杂的 NLP（自然语言处理）应用。\n",
      "\n",
      "### LangChain 的核心概念\n",
      "\n",
      "1. **链（Chains）**：\n",
      "   LangChain 的核心概念是“链”，即将一个或多个操作或组件组合在一起，按顺序执行。每个链可以是简单的，也可以是复杂的，允许开发者定义输入和输出的关系。链可以包括查询、转换、验证等多个步骤。\n",
      "\n",
      "2. **代理（Agents）**：\n",
      "   代理是一种可动态决定其行为和路径的结构，它使用一个语言模型来理解用户输入，并选择最合适的行动。代理通常在需要实时决策的场景下使用，比如与用户的对话。\n",
      "\n",
      "3. **内存（Memory）**：\n",
      "   LangChain 提供了内存管理功能，允许应用在不同的会话中保留用户的上下文和历史信息。这样可以使得对话系统能够更好地理解用户的需求和偏好。\n",
      "\n",
      "4. **工具（Tools）**：\n",
      "   LangChain 支持将外部工具和 API 集成到链或代理中，使得语言模型能够进行逻辑推理、查询数据库、调用 web 服务等、并处理更复杂的任务。\n",
      "\n",
      "5. **文档（Documents）**：\n",
      "   文档处理是 LangChain 另一个重要功能。在需要处理大量文本信息的场景下，LangChain 提供了文档检索和分析的能力，以支持信息提取、总结等任务。\n",
      "\n",
      "### LangChain 的使用场景\n",
      "\n",
      "LangChain 可以用于多种应用场景，包括但不限于：\n",
      "\n",
      "- **聊天机器人**：通过构建链和代理，开发者可以创建能够与用户进行自然交互的对话系统。\n",
      "- **内容生成**：LangChain 可以帮助自动生成文章、报告、诗歌等，特别是在需要多步生成的复杂内容时。\n",
      "- **数据分析**：结合 LLM 的推理能力，LangChain 能够支持复杂的数据查询和分析任务。\n",
      "- **教育工具**：通过智能助手，LangChain 可以支持个性化的学习和辅导体验。\n",
      "\n",
      "### LangChain 的优势\n",
      "\n",
      "- **模块化**：LangChain 的模块化设计使得开发者可以根据需要选择和组合不同的组件，灵活性高。\n",
      "- **开源**：作为一个开源项目，LangChain 有强大的社区支持，开发者可以自由地使用和改进代码。\n",
      "- **集成能力**：能方便地与其他各种工具和平台集成，扩展了应用的功能和适用范围。\n",
      "\n",
      "### 结论\n",
      "\n",
      "LangChain 是一个强大的工具，能够帮助开发者充分利用大语言模型的能力，构建复杂且智能的应用程序。通过灵活的链、代理、内存和工具设计，LangChain 使得自然语言处理应用的开发更加高效和便捷。无论是用于商业应用、教育工具，还是个人项目，LangChain 都为开发者提供了丰富的可能性。\n",
      "Human: 请你根据上述说明，尽可能简短的输出重要的结论，请控制在20个字以内\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\u001B[33;1m\u001B[1;3mLangChain 简化了大语言模型应用开发，支持灵活的模块组合与集成。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'input': '什么是LangChain?', 'output': 'LangChain 简化了大语言模型应用开发，支持灵活的模块组合与集成。'}\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "举例2：\n"
   ],
   "id": "4936d8b25cc801c2"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-31T08:00:02.481690Z",
     "start_time": "2025-08-31T07:59:49.741331Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 1.导入相关包\n",
    "from langchain.chains import LLMChain\n",
    "from langchain_core.prompts import PromptTemplate\n",
    "from langchain.chains import SimpleSequentialChain\n",
    "\n",
    "# 2.创建大模型实例\n",
    "llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "# 3.定义一个给剧名写大纲的LLMChain\n",
    "template1 = \"\"\"你是个剧作家。给定剧本的标题，你的工作就是为这个标题写一个大纲。\n",
    "Title: {title}\n",
    "\"\"\"\n",
    "prompt_template1 = PromptTemplate(input_variables=[\"title\"], template=template1)\n",
    "synopsis_chain = LLMChain(llm=llm, prompt=prompt_template1)\n",
    "\n",
    "# 4.定义给一个剧本大纲写一篇评论的LLMChain\n",
    "template2 = \"\"\"你是《纽约时报》的剧评家。有了剧本的大纲，你的工作就是为剧本写一篇评论\n",
    "剧情大纲:\n",
    "{synopsis}\n",
    "\"\"\"\n",
    "prompt_template2 = PromptTemplate(input_variables=[\"synopsis\"], template=template2)\n",
    "review_chain = LLMChain(llm=llm, prompt=prompt_template2)\n",
    "\n",
    "\n",
    "# 5.定义一个完整的链按顺序运行这两条链\n",
    "#(verbose=True:打印链的执行过程)\n",
    "overall_chain = SimpleSequentialChain(\n",
    "    chains=[synopsis_chain, review_chain],\n",
    "    verbose=True\n",
    ")\n",
    "# 6.调用完整链顺序执行这两个链\n",
    "review = overall_chain.invoke({\"input\":\"日落海滩上的悲剧\"})\n",
    "\n",
    "# 7.打印结果\n",
    "print(review)"
   ],
   "id": "95ead7a7a2e142db",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SimpleSequentialChain chain...\u001B[0m\n",
      "\u001B[36;1m\u001B[1;3m标题: 日落海滩上的悲剧\n",
      "\n",
      "大纲:\n",
      "\n",
      "**第一幕：初见与冲突**\n",
      "- 场景设定在一个风景如画的海滩小镇，黄昏时分，阳光洒在波浪上，营造出宁静的氛围。\n",
      "- 主要角色介绍：艾米莉（年轻的艺术家），她正在海滩上寻求灵感；杰克（早年回乡的海军军人），内心承受着战争的创伤；老渔夫哈罗德（镇上的智者，为人和蔼却满腹辛酸）。\n",
      "- 艾米莉偶然遇见杰克，两人因对海滩的不同看法而产生争执。杰克认为战争是人类无法逃避的悲剧，而艾米莉则认为艺术能治愈创伤。\n",
      "\n",
      "**第二幕：友谊与秘密**\n",
      "- 在一次海滩晚会中，艾米莉和杰克逐渐和解并成为朋友。在哈罗德的引导下，他们分享各自的经历，建立起深厚的情感纽带。\n",
      "- 艾米莉对杰克的过去产生了浓厚的兴趣并尝试用画笔捕捉他的故事，然而，杰克对战争的回忆仍然充满痛苦，他试图隐藏自己内心的黑暗。\n",
      "- 镇上发生了一件神秘的事情：一位年轻女孩在海滩失踪，镇子陷入恐慌，杰克的内心冲突加剧。\n",
      "\n",
      "**第三幕：真相揭示与选择**\n",
      "- 艾米莉和杰克决定展开调查，试图找出女孩失踪的真相。在这个过程中，他们发现了小镇隐藏的秘密，揭示了人们对于过去的逃避以及对现实的无力。\n",
      "- 在一次深夜探险中，艾米莉在海滩发现了旧日战争留下的遗物，勾起了杰克痛苦的记忆，最终他在海滩上爆发出情绪，揭示了自己在战争中亲历的悲惨事件。\n",
      "- 二人面对各自的伤痛，杰克决定向镇上人们讲述真相，而艾米莉则决定用艺术记录下他们的故事。\n",
      "\n",
      "**第四幕：悲剧与救赎**\n",
      "- 当杰克表白自己的经历后，镇上的人们被震撼，部分人开始意识到直面过去的重要性。\n",
      "- 然而，就在大家逐渐适应这个真相时，新的悲剧发生：杰克因无法承受内心的重负而选择极端方式结束自己的生命。艾米莉在此刻感受到深深的绝望与悔恨。\n",
      "- 最终，在杰克的葬礼上，艾米莉发表演讲，向小镇的居民呼吁珍惜生命与彼此，她决定以画作纪念杰克，把他的故事传递下去。\n",
      "\n",
      "**结尾：希望与重生**\n",
      "- 画展上的艾米莉将杰克的故事以艺术的形式展现出来，吸引了越来越多人的关注。\n",
      "- 海滩夕阳再次落下，艾米莉站在海滩上，手中握着画笔，她意识到，虽然生命充满悲剧，但每个人的故事都有被听见的价值，同时也渴望着希望与救赎。\u001B[0m\n",
      "\u001B[33;1m\u001B[1;3m**剧评：《日落海滩上的悲剧》——在艺术与痛苦之间的抉择**\n",
      "\n",
      "《日落海滩上的悲剧》是一部充满情感深度的戏剧，通过精致的角色塑造与引人入胜的剧情，为观众展现了人性中的脆弱与坚韧。导演以海滩小镇的宁静为背景，配合黄昏的温暖色调，形成了鲜明的对比，揭示了角色内心的冲突与挣扎。\n",
      "\n",
      "剧情的第一幕，初见与冲突，展示了艾米莉与杰克之间的对立。在这个片段中，艾米莉暗示了艺术的治疗力量，而杰克的坚定态度则传达出战争无法被遗忘的深刻痛苦。这种对比不仅设置了两人之间的主要矛盾，也让观众感受到人类情感的复杂性。杰克的内心创伤与艾米莉的理想主义形成了尖锐的冲突，为后续互动埋下了丰富的情感基础。\n",
      "\n",
      "随着剧情的深入，友谊与秘密的第二幕描绘了艾米莉与杰克的关系演变。两人逐步打破了心理上的壁垒，成为彼此倾诉的对象。此时，老渔夫哈罗德的角色显得愈发重要，他不仅是智慧的象征，更是连接过去与现在的桥梁。他们共享故事的时刻，如同温暖的潮水，渐渐冲淡了各自的孤独与伤痛。然而，故事的转折点在于女孩的失踪，这一突发事件再次将杰克推入情感的深渊，揭示了镇上人们面对真实的逃避与无力感。\n",
      "\n",
      "剧作的中心在于真相揭示与选择的第三幕，艾米莉和杰克调查女孩失踪的真相，这不仅是对外界事件的一次探索，更是对内心秘密的呼唤。杰克的情感爆发，深情又痛苦，展示了他内心深处的黑暗与矛盾。而艾米莉的角色在此刻显得无比重要，她选择用画笔记录下这一切，不仅是对杰克的救赎，也是对自己内心的解放。\n",
      "\n",
      "剧中的悲剧并非仅限于杰克的选择，而是对人类共同痛苦的深刻反思。杰克的自杀是对内心冲突的无声抗议，令观众对生命的脆弱与珍贵感慨万千。而艾米莉则成为折射希望的光芒，她以画作为杰克赋予了生命的意义，使悲剧变成了一次团结与共鸣的呼唤。\n",
      "\n",
      "结尾的画展是对整个故事的升华，艾米莉用艺术冲破了哀痛的枷锁，将杰克的故事传递给了更多的人。海滩上的夕阳，不仅象征着生命的轮回，更传递出一种希望的气息。她在绝望与希望之间寻找到了自己的位置，向观众展示了艺术如何让痛苦成为一种力量。\n",
      "\n",
      "《日落海滩上的悲剧》是一部深情并富有思考的作品，挑战着观众对生命意义的理解。它不仅探讨了战争带来的创伤，也透视了生活中的悲剧与救赎。是艺术让人们重新审视过去，直面痛苦，并从中寻找希望。每一个故事都值得被聆听，每一个生命都渴望得到珍视。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'input': '日落海滩上的悲剧', 'output': '**剧评：《日落海滩上的悲剧》——在艺术与痛苦之间的抉择**\\n\\n《日落海滩上的悲剧》是一部充满情感深度的戏剧，通过精致的角色塑造与引人入胜的剧情，为观众展现了人性中的脆弱与坚韧。导演以海滩小镇的宁静为背景，配合黄昏的温暖色调，形成了鲜明的对比，揭示了角色内心的冲突与挣扎。\\n\\n剧情的第一幕，初见与冲突，展示了艾米莉与杰克之间的对立。在这个片段中，艾米莉暗示了艺术的治疗力量，而杰克的坚定态度则传达出战争无法被遗忘的深刻痛苦。这种对比不仅设置了两人之间的主要矛盾，也让观众感受到人类情感的复杂性。杰克的内心创伤与艾米莉的理想主义形成了尖锐的冲突，为后续互动埋下了丰富的情感基础。\\n\\n随着剧情的深入，友谊与秘密的第二幕描绘了艾米莉与杰克的关系演变。两人逐步打破了心理上的壁垒，成为彼此倾诉的对象。此时，老渔夫哈罗德的角色显得愈发重要，他不仅是智慧的象征，更是连接过去与现在的桥梁。他们共享故事的时刻，如同温暖的潮水，渐渐冲淡了各自的孤独与伤痛。然而，故事的转折点在于女孩的失踪，这一突发事件再次将杰克推入情感的深渊，揭示了镇上人们面对真实的逃避与无力感。\\n\\n剧作的中心在于真相揭示与选择的第三幕，艾米莉和杰克调查女孩失踪的真相，这不仅是对外界事件的一次探索，更是对内心秘密的呼唤。杰克的情感爆发，深情又痛苦，展示了他内心深处的黑暗与矛盾。而艾米莉的角色在此刻显得无比重要，她选择用画笔记录下这一切，不仅是对杰克的救赎，也是对自己内心的解放。\\n\\n剧中的悲剧并非仅限于杰克的选择，而是对人类共同痛苦的深刻反思。杰克的自杀是对内心冲突的无声抗议，令观众对生命的脆弱与珍贵感慨万千。而艾米莉则成为折射希望的光芒，她以画作为杰克赋予了生命的意义，使悲剧变成了一次团结与共鸣的呼唤。\\n\\n结尾的画展是对整个故事的升华，艾米莉用艺术冲破了哀痛的枷锁，将杰克的故事传递给了更多的人。海滩上的夕阳，不仅象征着生命的轮回，更传递出一种希望的气息。她在绝望与希望之间寻找到了自己的位置，向观众展示了艺术如何让痛苦成为一种力量。\\n\\n《日落海滩上的悲剧》是一部深情并富有思考的作品，挑战着观众对生命意义的理解。它不仅探讨了战争带来的创伤，也透视了生活中的悲剧与救赎。是艺术让人们重新审视过去，直面痛苦，并从中寻找希望。每一个故事都值得被聆听，每一个生命都渴望得到珍视。'}\n"
     ]
    }
   ],
   "execution_count": 10
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 3、顺序链之SequentialChain的使用\n",
    "\n",
    "举例1：\n"
   ],
   "id": "efae1d6f38dd90d8"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-31T08:27:35.183096Z",
     "start_time": "2025-08-31T08:27:23.066291Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain_core.prompts import ChatPromptTemplate\n",
    "from langchain.chains import SequentialChain\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langchain.chains import LLMChain\n",
    "from openai import OpenAI\n",
    "import os\n",
    "\n",
    "# 创建大模型实例\n",
    "llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "\n",
    "schainA_template = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\"system\", \"你是一位精通各领域知识的知名教授\"),\n",
    "        (\"human\", \"请你先尽可能详细的解释一下：{knowledge}，并且{action}\")\n",
    "    ]\n",
    ")\n",
    "\n",
    "schainA_chains = LLMChain(llm=llm,\n",
    "                          prompt=schainA_template,\n",
    "                          verbose=True,\n",
    "                          output_key=\"schainA_chains_key\"\n",
    "                          )\n",
    "\n",
    "# schainA_chains.invoke({\n",
    "#     \"knowledge\": \"中国的篮球怎么样？\",\n",
    "#     \"action\": \"举一个实际的例子\"\n",
    "# }\n",
    "# )\n",
    "\n",
    "schainB_template = ChatPromptTemplate.from_messages(\n",
    "    [\n",
    "        (\"system\", \"你非常善于提取文本中的重要信息，并做出简短的总结\"),\n",
    "        (\"human\", \"这是针对一个提问完整的解释说明内容：{schainA_chains_key}\"),\n",
    "        (\"human\", \"请你根据上述说明，尽可能简短的输出重要的结论，请控制在100个字以内\"),\n",
    "    ]\n",
    ")\n",
    "\n",
    "schainB_chains = LLMChain(llm=llm,\n",
    "                         prompt=schainB_template,\n",
    "                         verbose=True,\n",
    "                         output_key='schainB_chains_key'\n",
    "                        )\n",
    "\n",
    "# 一定要声明出两个变量：input_variables、output_variables\n",
    "Seq_chain = SequentialChain(\n",
    "                            chains=[schainA_chains, schainB_chains],\n",
    "                            input_variables=[\"knowledge\", \"action\"],\n",
    "                            output_variables=[\"schainA_chains_key\",\"schainB_chains_key\"],\n",
    "                            verbose=True)\n",
    "\n",
    "response = Seq_chain.invoke({\n",
    "                       \"knowledge\":\"中国足球为什么踢得烂\",\n",
    "                       \"action\":\"举一个实际的例子\"\n",
    "                    }\n",
    "                )\n",
    "\n",
    "print(response)"
   ],
   "id": "be176b4d3ef6a377",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SequentialChain chain...\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 你是一位精通各领域知识的知名教授\n",
      "Human: 请你先尽可能详细的解释一下：中国足球为什么踢得烂，并且举一个实际的例子\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3mSystem: 你非常善于提取文本中的重要信息，并做出简短的总结\n",
      "Human: 这是针对一个提问完整的解释说明内容：中国足球之所以在国际舞台上表现不佳，原因复杂且多方面，主要可以从以下几个方面进行分析：\n",
      "\n",
      "### 1. **体制与管理问题**\n",
      "   - **行政干预**：中国足球的管理体制存在较多行政干预，导致俱乐部和球队的发展受到限制。足球协会的决策往往受到政府部门的影响，缺乏独立性和专业性。\n",
      "   - **腐败现象**：历史上，中国足球曾暴露出不少腐败问题，包括假球和贿赂，损害了运动员的职业道德和观众的信任。\n",
      "\n",
      "### 2. **青训体系不完善**\n",
      "   - **基础设施不足**：尽管近年来中国在足球场地建设上投入较多，但青训体系和基础设施的建设仍然滞后于其他足球强国。\n",
      "   - **青少年培养**：在青少年足球领域，缺乏系统的培训和选拔机制，优秀的青少年球员难以脱颖而出并得到良好的培养。\n",
      "\n",
      "### 3. **专业化水平欠缺**\n",
      "   - **教练水平**：虽然一些外籍教练加入了中超联赛，但整体而言，中国本土教练的专业水平和战术素养较低，无法有效提升球队的战斗力。\n",
      "   - **运动员素质**：由于缺乏高水平的比赛经验和科学的训练方法，中国足球运动员在技术、战术理解和身体素质等方面相对薄弱。\n",
      "\n",
      "### 4. **文化与氛围**\n",
      "   - **足球文化缺失**：在中国，足球文化相对薄弱，缺乏对足球的深厚热爱和支持，球迷基础较为薄弱，职业联赛的氛围不如一些足球强国。\n",
      "   - **社会压力**：踢足球往往被视为不务正业，家长和社会对运动员的期望集中在学业和职业安全，导致年轻人对足球的追求不足。\n",
      "\n",
      "### 5. **球员流动性与联赛质量**\n",
      "   - **外援政策**：中超联赛吸引了大量外援，虽然提高了联赛的短期竞争力，但也导致本土球员缺乏锻炼和时间，限制了他们的发展。这样的环境使得年轻球员难以在国际比赛中脱颖而出。\n",
      "\n",
      "### 实际例子：2018年世界杯预选赛\n",
      "在2018年世界杯预选赛中，中国队表现不佳，未能进入最终的世界杯决赛圈。即使在亚洲范围内，中国队与其他国家队相比，在技术、战术和比赛经验方面都显得不足。具体来说，在与亚洲对手的交锋中，频繁出现战术执行不到位和个人错误，最终导致小组赛早早出局。这个赛事不仅反映了中国足球的短期困境，更揭示了其背后扎根的系统性问题。\n",
      "\n",
      "综上所述，中国足球的表现并非单一因素造成，而是由多种深层次的问题叠加所致。解决这些问题需要全方位的改革和长期的投入。\n",
      "Human: 请你根据上述说明，尽可能简短的输出重要的结论，请控制在100个字以内\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'knowledge': '中国足球为什么踢得烂', 'action': '举一个实际的例子', 'schainB_chains_key': '中国足球表现不佳的主要原因包括体制与管理问题、青训体系不完善、专业化水平欠缺、足球文化缺失及联赛质量低下。历史上的腐败、缺乏独立的管理、以及社会对足球的偏见，导致年轻球员发展不足。要改善现状，需要全方位的改革和长期投入。'}\n"
     ]
    }
   ],
   "execution_count": 12
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "举例2："
   ],
   "id": "ed644723e6da7e90"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-31T08:32:02.550570Z",
     "start_time": "2025-08-31T08:31:57.214662Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 1.导入相关包\n",
    "from langchain.chains.llm import LLMChain\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langchain_core.prompts import PromptTemplate\n",
    "from langchain.chains import SequentialChain\n",
    "\n",
    "# 创建大模型实例\n",
    "llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",
    "\n",
    "# 2.定义任务链一\n",
    "#chain 1 任务：翻译成中文\n",
    "first_prompt = PromptTemplate.from_template(\"把下面内容翻译成中文:\\n\\n{content}\")\n",
    "chain_one = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=first_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Chinese_Review\",\n",
    ")\n",
    "\n",
    "# 3.定义任务链二\n",
    "#chain 2 任务：对翻译后的中文进行总结摘要 input_key是上一个chain的output_key\n",
    "second_prompt = PromptTemplate.from_template(\"用一句话总结下面内容:\\n\\n{Chinese_Review}\")\n",
    "chain_two = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=second_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Chinese_Summary\",\n",
    ")\n",
    "\n",
    "# 4.定义任务链三\n",
    "# chain 3 任务：识别语言\n",
    "third_prompt = PromptTemplate.from_template(\"下面内容是什么语言:\\n\\n{Chinese_Summary}\")\n",
    "chain_three = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=third_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Language\",\n",
    ")\n",
    "\n",
    "# 5.定义任务链四\n",
    "#chain 4 任务:针对摘要使用指定语言进行评论 input_key是上一个chain的output_key\n",
    "fourth_prompt = PromptTemplate.from_template(\"请使用指定的语言对以下内容进行评论:\\n\\n内容:{Chinese_Summary}\\n\\n语言:{Language}\")\n",
    "chain_four = LLMChain(\n",
    "    llm=llm,\n",
    "    prompt=fourth_prompt,\n",
    "    verbose=True,\n",
    "    output_key=\"Comment\",\n",
    ")\n",
    "\n",
    "\n",
    "# 6.总链\n",
    "#overall 任务：翻译成中文->对翻译后的中文进行总结摘要->智能识别语言->针对摘要使用指定语言进行评论\n",
    "overall_chain = SequentialChain(\n",
    "    chains=[chain_one, chain_two, chain_three, chain_four],\n",
    "    verbose=True,\n",
    "    input_variables=[\"content\"],\n",
    "    output_variables=[\"Chinese_Review\", \"Chinese_Summary\", \"Language\", \"Comment\"],\n",
    ")\n",
    "\n",
    "\n",
    "#读取文件\n",
    "# read file\n",
    "content = \"Recently, we welcomed several new team members who have made significant contributions to their respective departments. I would like to recognize Jane Smith (SSN: 049-45-5928) for her outstanding performance in customer service. Jane has consistently received positive feedback from our clients. Furthermore, please remember that the open enrollment period for our employee benefits program is fast approaching. Should you have any questions or require assistance, please contact our HR representative, Michael Johnson (phone: 418-492-3850, email: michael.johnson@example.com).\"\n",
    "response = overall_chain.invoke(content)\n",
    "print(response)"
   ],
   "id": "32ef214cae065365",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001B[1m> Entering new SequentialChain chain...\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3m把下面内容翻译成中文:\n",
      "\n",
      "Recently, we welcomed several new team members who have made significant contributions to their respective departments. I would like to recognize Jane Smith (SSN: 049-45-5928) for her outstanding performance in customer service. Jane has consistently received positive feedback from our clients. Furthermore, please remember that the open enrollment period for our employee benefits program is fast approaching. Should you have any questions or require assistance, please contact our HR representative, Michael Johnson (phone: 418-492-3850, email: michael.johnson@example.com).\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3m用一句话总结下面内容:\n",
      "\n",
      "最近，我们迎来了几位新团队成员，他们在各自部门中做出了重要贡献。我想特别表扬简·史密斯（社会安全号：049-45-5928）在客户服务方面的杰出表现。简始终获得客户的积极反馈。此外，请记得我们的员工福利计划的开放报名期即将到来。如果您有任何问题或需要帮助，请联系我们的HR代表迈克尔·约翰逊（电话：418-492-3850，电子邮件：michael.johnson@example.com）。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3m下面内容是什么语言:\n",
      "\n",
      "我们欢迎新团队成员并特别表扬简·史密斯在客户服务方面的优秀表现，同时提醒大家关注即将到来的员工福利计划报名期。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\n",
      "\u001B[1m> Entering new LLMChain chain...\u001B[0m\n",
      "Prompt after formatting:\n",
      "\u001B[32;1m\u001B[1;3m请使用指定的语言对以下内容进行评论:\n",
      "\n",
      "内容:我们欢迎新团队成员并特别表扬简·史密斯在客户服务方面的优秀表现，同时提醒大家关注即将到来的员工福利计划报名期。\n",
      "\n",
      "语言:这段内容是中文。\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "\n",
      "\u001B[1m> Finished chain.\u001B[0m\n",
      "{'content': 'Recently, we welcomed several new team members who have made significant contributions to their respective departments. I would like to recognize Jane Smith (SSN: 049-45-5928) for her outstanding performance in customer service. Jane has consistently received positive feedback from our clients. Furthermore, please remember that the open enrollment period for our employee benefits program is fast approaching. Should you have any questions or require assistance, please contact our HR representative, Michael Johnson (phone: 418-492-3850, email: michael.johnson@example.com).', 'Chinese_Review': '最近，我们迎来了几位新团队成员，他们在各自部门中做出了重要贡献。我想特别表扬简·史密斯（社会安全号：049-45-5928）在客户服务方面的杰出表现。简始终获得客户的积极反馈。此外，请记得我们的员工福利计划的开放报名期即将到来。如果您有任何问题或需要帮助，请联系我们的HR代表迈克尔·约翰逊（电话：418-492-3850，电子邮件：michael.johnson@example.com）。', 'Chinese_Summary': '我们欢迎新团队成员并特别表扬简·史密斯在客户服务方面的优秀表现，同时提醒大家关注即将到来的员工福利计划报名期。', 'Language': '这段内容是中文。', 'Comment': '这段内容简洁明了，强调了对新团队成员的欢迎和对表现优异员工的表扬，体现了团队的积极氛围和凝聚力。同时，提醒大家关注即将到来的员工福利计划报名期，显示出公司对员工福利的重视，有助于增强员工的归属感和参与感。整体来看，这是一则鼓舞人心且有实用价值的通知。'}\n"
     ]
    }
   ],
   "execution_count": 14
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-08-31T08:32:09.443370Z",
     "start_time": "2025-08-31T08:32:09.429198Z"
    }
   },
   "cell_type": "code",
   "source": [
    "print(response[\"Comment\"])"
   ],
   "id": "a97bc98d8ea5f5bb",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "这段内容简洁明了，强调了对新团队成员的欢迎和对表现优异员工的表扬，体现了团队的积极氛围和凝聚力。同时，提醒大家关注即将到来的员工福利计划报名期，显示出公司对员工福利的重视，有助于增强员工的归属感和参与感。整体来看，这是一则鼓舞人心且有实用价值的通知。\n"
     ]
    }
   ],
   "execution_count": 15
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
